﻿#region License
/******************************************************************************
 * Copyright (c) 2009, Tim Savage - Joocey Labs
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * * Redistributions of source code must retain the above copyright notice, this 
 *   list of conditions and the following disclaimer.
 *    
 * * Redistributions in binary form must reproduce the above copyright notice, this
 *   list of conditions and the following disclaimer in the documentation and/or 
 *   other materials provided with the distribution.
 *    
 * * Neither the name of Joocey Labs nor the names of its contributors may be used
 *   to endorse or promote products derived from this software without specific 
 *   prior written permission.
 *   
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/
#endregion

namespace JL.Web.Forms.Utils
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;


    /// <summary>
    /// Helper class for converting values from html forms.
    /// </summary>
    public static class ConversionHelper
    {
        private static List<object> TrueValues = new List<object>() { 
            true, bool.TrueString, "on", "1", 1 
        };

        private static List<object> FalseValues = new List<object>() { 
            false, bool.FalseString, "off", "0", 0 
        };

        /// <summary>
        /// Determine if we consider the object empty
        /// </summary>
        /// <param name="value">Object to check.</param>
        /// <returns>True if object is empty; else false.</returns>
        public static bool IsEmpty(object value)
        {
            if (value == null) return true;
            if (value.Equals(string.Empty)) return true;
            var strValue = value as string;
            if (strValue != null) return strValue.Trim().Length == 0;
            /*var listValue = value as IList;
            if (listValue != null) return listValue.Count == 0;*/
            return false;
        }

        #region Boolean

        /// <summary>
        /// Convert a value returned from a form into a bool.
        /// </summary>
        /// <param name="value">Value to convert.</param>
        /// <returns>Boolean value.</returns>
        public static bool Boolean(object value)
        {
            // Null is considered false
            if (IsEmpty(value)) return false;
            if (FalseValues.Contains(value)) return false;
            return true;
        }

        /// <summary>
        /// Convert a value returned from a form into a bool?.
        /// </summary>
        /// <param name="value">Value to convert.</param>
        /// <returns>Nullable Boolean value.</returns>
        public static bool? NullBoolean(object value)
        {
            if (TrueValues.Contains(value)) return true;
            if (FalseValues.Contains(value)) return false;
            return null;
        }
        
        #endregion

        #region Collections

        /// <summary>
        /// Convert value to to object List
        /// </summary>
        /// <param name="value">Value to convert</param>
        /// <returns></returns>
        public static Collection<object> ObjectList(object value)
        {
            // Return empty collection
            if (value == null) return null; // new Collection<object>();
            // Just return the collection
            var collection = value as Collection<object>;
            if (collection != null) return collection;
            // Return collection preloaded
            if (value.GetType().IsArray) return new Collection<object>((object[])value);
            // Wrap item in collection
            var result = new Collection<object>();
            result.Add(value);
            return result;
        }

        /// <summary>
        /// Split a comma delimited string returned by form into an Object List
        /// </summary>
        /// <param name="value">String value to split.</param>
        /// <returns></returns>
        public static Collection<object> SplitString(string value)
        {
            char[] delimiter = new char[] { ',' };

            // Return empty collection
            if (string.IsNullOrEmpty(value)) return new Collection<object>();

            // Return result of split
            return new Collection<object>(value.Split(delimiter));
        }
        
        #endregion
    }
}
